import pl.shenlon.assets.Assets;
import pl.shenlon.ga.SimpleSpecimen;
import pl.shenlon.ga.Specimen;
import pl.shenlon.poker.cards.Hand;
import pl.shenlon.poker.cards.deck.Deck;
import pl.shenlon.poker.cards.deck.PokerDeck;
import pl.shenlon.poker.game.PlayerActionType;
import pl.shenlon.poker.game.PokerPlayer;
import pl.shenlon.poker.game.gametypes.FixedLimitPokerGame;
import pl.shenlon.poker.gui.DefaultHandComponentModel;
import pl.shenlon.poker.gui.GameDialog;
import pl.shenlon.poker.gui.HandComponentModel;
import tests.pl.shenlon.poker.game.gametypes.MockPokerPlayer;

//import java.io.BufferedWriter;
//import java.io.File;
//import java.io.FileWriter;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Scanner;
//
//import pl.shenlon.poker.cards.Card;
//import pl.shenlon.poker.cards.Hand;
//import pl.shenlon.poker.cards.HandEvaluator;
//import pl.shenlon.poker.cards.HandRank;
//import pl.shenlon.poker.cards.PokerDeck;
//
//public class Test {
//	static Card[] cards = new PokerDeck().getCardsInDeck();
//
//	static HandEvaluator evaluator = HandEvaluator.getInstance();
//
//	public static void main(String[] args) throws IOException {
//		// Card[] cards = new Card[]{
//		// new Card(CardSuit.HEARTS, CardRank.KING),
//		// new Card(CardSuit.HEARTS, CardRank.QUEEN),
//		// new Card(CardSuit.HEARTS, CardRank.JACK),
//		// new Card(CardSuit.HEARTS, CardRank.NINE),
//		// new Card(CardSuit.HEARTS, CardRank.TEN),
//		// new Card(CardSuit.HEARTS, CardRank.ACE),
//		// new Card(CardSuit.SPADES, CardRank.FIVE),};
//		// Hand hand = new Hand(cards);
//		//
//		// HandEvaluator evaluator = HandEvaluator.getInstance();
//		// long time = System.currentTimeMillis();
//		//
//		// int count = 0;
//		//
//		// while (System.currentTimeMillis() - time < 1000) {
//		// evaluator.isPair(hand);
//		// count++;
//		// }
//		// System.out.println(count);
//		// JDialog dialog = new JDialog();
//		// dialog.setModal(true);
//		// dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
//		// dialog.setVisible(true);
//		// }
//		// Deck deck = new PokerDeck();
//		// long time = 0;
//		// Hand hand = new Hand(2);
//		// Hand table = new Hand(5);
//		// HandEvaluator handEvaluator = HandEvaluator.getInstance();
//		// int count = 0;
//		// while (time <= 1000) {
//		// deck.shuffle();
//		// for (int i = 0; i < 2; i++) {
//		// hand.setCard(i, deck.next());
//		// hand.getCard(i).setFaceUp(true);
//		// }
//		// for (int i = 0; i < 5; i++) {
//		// table.setCard(i, deck.next());
//		// table.getCard(i).setFaceUp(true);
//		// }
//		// long start = System.currentTimeMillis();
//		// handEvaluator.evaluateHand(hand, table);
//		// time += System.currentTimeMillis() - start;
//		// count++;
//		// }
//		// System.out.println(count);
//		// Map<Character, Double> charCount = new HashMap<Character, Double>();
//		// String text = "T REZ LDTR I LV R P IEL JIT PV ZI L";
//		//
//		// for (int i = 0; i < text.length(); i++) {
//		// char c = text.charAt(i);
//		// if (charCount.containsKey(c)) {
//		// charCount.put(c, charCount.get(c) + 1);
//		// } else {
//		// charCount.put(c, 1.0);
//		// }
//		// }
//		// System.out.println(charCount);
//		// int length = text.length() - 11;
//		// for (Character key : charCount.keySet()) {
//		// charCount.put(key, charCount.get(key) / length);
//		// }
//		// System.out.println(charCount);
//		//
//		// Deck deck = new PokerDeck();
//		// Card[] deckCards = deck.getCardsInDeck();
//		//
//		// HandEvaluator evaluator = HandEvaluator.getInstance();
//		// long start = System.currentTimeMillis();
//		// Map<String, List<String>> combinations = getNCR(51, 7);
//		// Hand emptyHand = new Hand(0);
//		//
//		// // BufferedWriter out = new BufferedWriter(new FileWriter(
//		// // "outs/preflop.dat"));
//		//
//		// for (String hand : combinations.keySet()) {
//		// System.out.println(hand);
//		// Hand aHand = new Hand(hand);
//		// String name = "";
//		// for (Card card : aHand.getCards()) {
//		// name += card.hashCode();
//		// }
//		//
//		// HandRank handRank = evaluator.evaluateHand(aHand, emptyHand);
//		// List<String> tables = combinations.get(hand);
//		// Map<String, Long> outs = new HashMap<String, Long>();
//		//
//		// outs.put("PAIR", 0l);
//		// outs.put("TWO", 0l);
//		// outs.put("THREE", 0l);
//		// outs.put("STRAIGHT", 0l);
//		// outs.put("FLUSH", 0l);
//		// outs.put("FULL", 0l);
//		// outs.put("FOUR", 0l);
//		// outs.put("STRAIGHT_FLUSH", 0l);
//		// outs.put("ROYAL", 0l);
//		// for (String table : tables) {
//		// Hand aTable = new Hand(table);
//		// aTable.show();
//		// HandRank rank = evaluator.evaluateHand(aHand, aTable);
//		// for (String key : outs.keySet()) {
//		// evaluateShit(rank, key, outs, handRank);
//		// }
//		// }
//		//
//		// // System.out.println(hand + " = " + outs);
//		// }
//		// System.out.println(System.currentTimeMillis() - start);
//		// saveNCR(51, 5, new File("test.dat"));
//		// saveFlop(new File("test.dat"));
//		// saveTurn(new File("turn.dat"));
//		// saveRiver(new File("river.dat"));
//		analizeFile(new File("test.dat"), 2);
//	}
//
//	public static final Map<String, List<String>> getNCR(final int n,
//			final int r) {
//		Map<String, List<String>> hands = new HashMap<String, List<String>>();
//		int[] res = new int[r];
//		for (int i = 0; i < res.length; i++) {
//			res[i] = i + 1;
//		}
//		boolean done = false;
//		while (!done) {
//			String hand = cards[res[0]].toString() + "-"
//					+ cards[res[1]].toString();
//			String table = "";
//			for (int i = 2; i < res.length; i++) {
//				table += cards[res[i]] + "-";
//			}
//			table = table.substring(0, table.length() - 1);
//
//			if (hands.containsKey(hand)) {
//				hands.get(hand).add(table);
//			} else {
//				hands.put(hand, new ArrayList<String>());
//				hands.get(hand).add(table);
//			}
//
//			done = getNext(res, n, r);
//		}
//		return hands;
//	}
//
//	public static final boolean getNext(final int[] num, final int n,
//			final int r) {
//		int target = r - 1;
//		num[target]++;
//		if (num[target] > ((n - (r - target)) + 1)) {
//			// Carry the One
//			while (num[target] > ((n - (r - target)))) {
//				target--;
//				if (target < 0) {
//					break;
//				}
//			}
//			if (target < 0) {
//				return true;
//			}
//			num[target]++;
//			for (int i = target + 1; i < num.length; i++) {
//				num[i] = num[i - 1] + 1;
//			}
//		}
//		return false;
//	}
//
//	private static void evaluateShit(HandRank rank, String string,
//			Map<String, Long> map, HandRank rank2) {
//		if (rank.toString().startsWith(string) && rank.compareTo(rank2) > 0) {
//			map.put(string, map.get(string) + 1);
//		}
//	}
//
//	private static void saveNCR(final int n, final int r, File file)
//			throws IOException {
//		BufferedWriter out = new BufferedWriter(new FileWriter(file));
//
//		int[] res = new int[r];
//		for (int i = 0; i < res.length; i++) {
//			res[i] = i + 1;
//		}
//		boolean done = false;
//		while (!done) {
//			String hand = cards[res[0]].toString() + "-"
//					+ cards[res[1]].toString();
//			String table = "";
//			for (int i = 2; i < res.length; i++) {
//				table += cards[res[i]] + "-";
//			}
//			table = table.substring(0, table.length() - 1);
//			out.write(hand + "-" + table);
//			out.newLine();
//			done = getNext(res, n, r);
//		}
//		out.close();
//	}
//
//	public static void saveFlop(File file) throws IOException {
//		BufferedWriter out = new BufferedWriter(new FileWriter(file));
//		for (int i = 0; i < 52; i++) {
//			for (int j = i + 1; j < 52; j++) {
//				for (int k = j + 1; k < 52; k++) {
//					for (int l = k + 1; l < 52; l++) {
//						for (int m = l + 1; m < 52; m++) {
//							String hand = cards[i] + "-" + cards[j] + "-"
//									+ cards[k] + "-" + cards[l] + "-"
//									+ cards[m];
//							out.write(hand);
//							out.newLine();
//						}
//					}
//				}
//			}
//		}
//		out.close();
//	}
//
//	public static void saveTurn(File file) throws IOException {
//		BufferedWriter out = new BufferedWriter(new FileWriter(file));
//		for (int i = 0; i < 52; i++) {
//			for (int j = i + 1; j < 52; j++) {
//				for (int k = j + 1; k < 52; k++) {
//					for (int l = k + 1; l < 52; l++) {
//						for (int m = l + 1; m < 52; m++) {
//							for (int n = m + 1; n < 52; n++) {
//								String hand = cards[i] + "-" + cards[j] + "-"
//										+ cards[k] + "-" + cards[l] + "-"
//										+ cards[m] + "-" + cards[n];
//								out.write(hand);
//								out.newLine();
//							}
//						}
//					}
//				}
//			}
//		}
//		out.close();
//	}
//
//	public static void saveRiver(File file) throws IOException {
//		BufferedWriter out = new BufferedWriter(new FileWriter(file));
//		for (int i = 0; i < 52; i++) {
//			for (int j = i + 1; j < 52; j++) {
//				for (int k = j + 1; k < 52; k++) {
//					for (int l = k + 1; l < 52; l++) {
//						for (int m = l + 1; m < 52; m++) {
//							for (int n = m + 1; n < 52; n++) {
//								for (int o = n + 1; o < 52; o++) {
//									String hand = cards[i] + "-" + cards[j]
//											+ "-" + cards[k] + "-" + cards[l]
//											+ "-" + cards[m] + "-" + cards[n]
//											+ "-" + cards[o];
//									out.write(hand);
//									out.newLine();
//								}
//							}
//						}
//					}
//				}
//			}
//		}
//		out.close();
//	}
//
//	public static void analizeFile(File file, int handSize) throws IOException {
//		Scanner in = new Scanner(file);
//		Map<String, Map<String, Long>> handOuts = new HashMap<String, Map<String, Long>>();
//		List<String> handsList = new ArrayList<String>();
//		while (in.hasNextLine()) {
//			String[] cards = in.nextLine().split("-");
//			String hand = "";
//			String table = "";
//			for (int i = 0; i < handSize; i++) {
//				hand += cards[i] + "-";
//			}
//
//			hand = hand.substring(0, hand.length() - 1);
//			for (int i = handSize; i < cards.length; i++) {
//				table += cards[i] + "-";
//			}
//			if (!handOuts.containsKey(hand)) {
//				Map<String, Long> outs = new HashMap<String, Long>();
//				outs.put("PAIR", 0l);
//				outs.put("TWO", 0l);
//				outs.put("THREE", 0l);
//				outs.put("STRAIGHT", 0l);
//				outs.put("FLUSH", 0l);
//				outs.put("FULL", 0l);
//				outs.put("FOUR", 0l);
//				outs.put("STRAIGHT_FLUSH", 0l);
//				outs.put("ROYAL", 0l);
//				handOuts.put(hand, outs);
//			}
//			table = table.substring(0, table.length() - 1);
//			if (!handsList.contains(hand)) {
//				handsList.add(hand);
//			}
//			Hand aHand = new Hand(hand);
//			Hand aTable = new Hand(table);
//			aTable.show();
//			HandRank rank = evaluator.evaluateHand(aHand, aTable),
//					 handRank = evaluator.evaluateHand(aHand);
//			Map<String, Long> handMap = handOuts.get(hand);
//			for (String key : handMap.keySet()) {
//				evaluateShit(rank, key, handMap, handRank);
//			}
//
//		}
//		in.close();
//		java.util.Collections.sort(handsList);
//		BufferedWriter out = new BufferedWriter(new FileWriter("out.data"));
//		for (String key : handsList) {
//			out.write(key);
//			out.newLine();
//		}
//		out.close();
//		// for (String key : handOuts.keySet()) {
//		// out.write(key);
//		// out.write(" ");
//		// Map<String, Long> outs = handOuts.get(key);
//		// for (Long value : outs.values()) {
//		// out.write(value.toString());
//		// out.write(" ");
//		// }
//		// out.newLine();
//		// }
//		// out.close();
//	}
// }

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Assets.initialize(Test.class
				.getResource("/data/assets/assets_config.xml"));
		Hand playerAHand = new Hand(2), playerBHand = new Hand(2), tableCards = new Hand(
				5);
		Deck deck = new PokerDeck();
		deck.shuffle();
		for (int i = 0; i < playerAHand.getCardsCount(); i++) {
			playerAHand.setCard(i, deck.next());
		}

		for (int i = 0; i < playerBHand.getCardsCount(); i++) {
			playerBHand.setCard(i, deck.next());
		}

		HandComponentModel model = new DefaultHandComponentModel();
		model.setHand(playerBHand);

		for (int i = 0; i < tableCards.getCardsCount(); i++) {
			tableCards.setCard(i, deck.next());
		}

		// HandComponentModel model = new DefaultHandComponentModel();
		// model.setHand(playerAHand);
		//
		// HandComponent handComponent = new HandComponent(model);
		// Color tableColor = (Color) Assets.get("@colours/table");
		// // handComponent.setBackground(tableColor);
		// TableComponent table = new TableComponent();
		// table.setBackground(tableColor);
		// table.setPlayerAHand(playerAHand);
		// table.setPlayerBHand(playerBHand);
		// table.setTableCards(tableCards);
		// table.setBorder(BorderFactory.createLineBorder(
		// new Color(201, 148, 123), 4));
		// JFrame f = new JFrame();
		// f.setLayout(new BorderLayout());
		// f.add(handComponent);
		// f.add(table);
		// f.pack();
		// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// f.setLocationRelativeTo(null);
		// f.setVisible(true);

		PokerPlayer player = new MockPokerPlayer(1000, PlayerActionType.BLUFF,
				"A"), playerB = new MockPokerPlayer(500,
				PlayerActionType.CHECK, "B");
		player.getHand().setCards(playerAHand.getCards());
		playerB.getHand().setCards(playerBHand.getCards());
		// player.getHand().setCards(playerAHand.getCards());
		// PlayerView view = new PlayerView(player);
		// PlayerView view2 = new PlayerView(player);
		// JFrame f = new JFrame();
		// f.setLayout(new BorderLayout());
		// //f.add(handComponent);
		// // f.add(table);
		// f.add(view, BorderLayout.NORTH);
		// f.add(table, BorderLayout.CENTER);
		// f.add(view2, BorderLayout.SOUTH);
		// view2.setPlayerImage((BufferedImage) Assets.get("@players/-1"));
		// f.pack();
		// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// f.setLocationRelativeTo(null);
		// // f.setVisible(true);

		GameDialog gameDialog = new GameDialog();
		Specimen specimen = new SimpleSpecimen(new int[]{10, 10, 10, 10, 10});
		gameDialog.newGame(1000, specimen, new FixedLimitPokerGame());
		// GameDialog gameDialog = new GameDialog();
		//
		// gameDialog.setPlayerA(player);
		// gameDialog.setPlayerB(playerB);
		// gameDialog.setTableCards(tableCards);
		// gameDialog.setModal(false);
		// gameDialog.setVisible(true);
		// for (int i = 0; i < tableCards.getCardsCount(); i++) {
		// tableCards.show(i);
		// // System.out.println(i);
		// Thread.sleep(500);
		// }
		// playerBHand.show();

		// Card[] cards = new PokerDeck().getCardsInDeck();
		//
		// for (Card card : cards) {
		// System.out.println(card.hashCode());
		// }

		// Population<SimpleSpecimen> p = new Population<SimpleSpecimen>(10,
		// SimpleSpecimen.class);
		//
		// for (int i = 0; i < 10; i++) {
		// p.breed();
		// System.out.println(p.getFittestSpecimen()[0]);
		// }
		// SimplePopulation population = new SimplePopulation(100);
		// for (int i = 0; i < 10; i++) {
		// long time = System.currentTimeMillis();
		// population.breed();
		// System.out.println(population.getFittestSpecimens()[0] + " " +
		// (System.currentTimeMillis() - time));
		// // }
		// Population<StatefulSpecimen> population = new Population<>(100,
		// StatefulSpecimen.class);
		//
		// PopulationEvaluator.TEST_HANDS.add(new TestHand(
		// "9♠-A♦ 9♥-7♦ 5♦-2♥-8♥-8♦-A♣"));
		// PopulationEvaluator.TEST_HANDS.add(new TestHand(
		// "9♠-A♦ 9♥-7♦ 5♦-2♥-8♥-8♦-A♣"));
		// PopulationEvaluator.TEST_HANDS.add(new TestHand(
		// "9♠-A♦ 9♥-7♦ 5♦-2♥-8♥-8♦-A♣"));
		// PopulationEvaluator.TEST_HANDS.add(new TestHand(
		// "9♠-A♦ 9♥-7♦ 5♦-2♥-8♥-8♦-A♣"));
		// for (int i = 0; i < 10; i++) {
		// population.breed();
		// System.out.println(population.getPopulation()[0] + " "
		// + population.getPopulation()[0].getScore());
		//
		// }
		// population.evaluatePopulation();
		// population.sortDescending();
		// System.out.println(population.getFittestSpecimen()[0]);

		// TestHandsCreationDialog dialog = new TestHandsCreationDialog();
		// dialog.pack();
		// dialog.setVisible(true);
		// TestHandsManagerDialog managerDialog = new TestHandsManagerDialog();
		// managerDialog.setVisible(true);

		// SpecimenDataView view = new SpecimenDataView();
		// view.setSpecimen(new StatefulSpecimen());
		// JFrame f = new JFrame();
		// f.add(view);
		// f.pack();
		// f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// f.setVisible(true);
		// Population<StatefulSpecimen> population = new Population<>(1,
		// StatefulSpecimen.class);
		//
		// Element persistedPopulation =
		// PopulationPersistance.persist(population);
		// XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
		// // try {
		// // outputter.output(persistedPopulation, System.out);
		// // } catch (IOException e) {
		// // // TODO Auto-generated catch block
		// // e.printStackTrace();
		// // }
		// Population<?> restoredPopulation = PopulationPersistance
		// .restorePopulation(persistedPopulation);
	}

}
